home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / amiexpress / source / ae / code / ax3.00 / customcommand.c < prev    next >
Encoding:
C/C++ Source or Header  |  1980-01-03  |  11.7 KB  |  439 lines

  1. #include "bbs.h"
  2. #include <dos/dostags.h>
  3. #include <workbench/workbench.h>
  4. #include <clib/icon_protos.h>
  5. char Xprlib[100];
  6. char prototitle[100];
  7. char XprOpts[200];
  8. extern UBYTE serin[];
  9. int StartProcess(char *s,ULONG Stack);
  10. /*extern struct Commands *Cmds;
  11. extern struct User User;
  12. extern char MAINMENU_Li[];
  13. */
  14. int Async;
  15. #define STRNULL ""
  16. int notvaliddoor=0;
  17. int UpperCheck(char str1[],char str2[]);
  18. int CheckInUse(char *str);
  19. void RemoveEnvDoor(char *str);
  20. void DoorLog(char Type,char *str);
  21. int ErrorDoorInUse;
  22. int DOORTYPE;
  23. int DoorAccessHigher;
  24. char DoorPassWord[20];
  25. UBYTE ServerCommand[255];
  26. ULONG DoorStack=4096L;   
  27. void UnLockDoor(BPTR *DoorLock);  
  28. char *LookUp(char str[],char File[],int Private,BPTR *LockDoor);                      
  29. int PassParams=0;
  30. int CustomCommand(char Location[],char CustomCmd[],int Private)
  31. {
  32.    FILE *fi;
  33.    register int i=0;
  34.    int stat;
  35.    char str[200];
  36.    char RunIt[200];
  37.    char TempCmd[200];
  38. BPTR LockDoor=NULL;
  39.    notvaliddoor=0;
  40.    ErrorDoorInUse=0;
  41.    DoorAccessHigher=FALSE;
  42.     strlim(ServerCommand,CustomCmd,195);StripReturn(ServerCommand);
  43.    strcpy(RunIt,Location);
  44.    strlim(TempCmd,CustomCmd,195);
  45.    while(TempCmd[i]!='\0')
  46.    {
  47.       if(TempCmd[i]==' ') { TempCmd[i]='\0'; break; }
  48.       i++;
  49.    }
  50.  
  51.    strcpy(str,LookUp(TempCmd,RunIt,Private,&LockDoor));
  52.  
  53.    StripReturn(str);
  54.    if(*(str)!='\0' && Cmds->AcLvl[LVL_NODE_NUMBER]<10 && !notvaliddoor && !ErrorDoorInUse)
  55.    {
  56.        if(DOORTYPE!='G' )
  57.        {
  58.  
  59.         if((fi=fopen(str,"r"))==NULL) 
  60.         {
  61.            
  62.             AEPutStr("Error, can't locate Custom Command\n\r");
  63.             AEPutStr("or Command is in use\n\r");
  64.             UnLockDoor(&LockDoor);
  65.             return(0);
  66.         } fclose(fi);
  67.        }
  68.        else { 
  69.           if(DoorPassWord[0]!='\0')
  70.         {
  71.            AEPutStr("\r\n");
  72.            AEPutStr("Enter Password >: ");
  73.            strcpy(TempCmd,"");
  74.            stat=LineInputConverted("",TempCmd,15,KEYBOARD_TIMEOUT);
  75.            if(stat<0) {   UnLockDoor(&LockDoor); return(2); }
  76.            stat=StringCompare(TempCmd,DoorPassWord);
  77.            if(strcmp(TempCmd,DoorPassWord))
  78.            {
  79.              AEPutStr("\r\nInValid Password!\r\n\r\n"); UnLockDoor(&LockDoor); return(1); 
  80.              
  81.            }
  82.            else AEPutStr("\r\n");
  83.         }
  84.         if(PassParams)
  85.         { sprintf(MAINMENU_Li,"%s%s",str,&ServerCommand[i]); return(PassParams); }
  86.         strcpy(MAINMENU_Li,str); return(2); 
  87.       }
  88.         SetEnvStat(ENV_DOORS);
  89.         switch(DOORTYPE)
  90.         {
  91.           case 'I': sprintf(RunIt,"%s %d",str,Cmds->AcLvl[LVL_NODE_NUMBER]);
  92.                     break;
  93.           case 'P': sprintf(RunIt,"%sUtils/PARADOOR %s %d",Cmds->BBSLoc,str,Cmds->AcLvl[LVL_NODE_NUMBER]);
  94.                     break;
  95.           case 'R': sprintf(RunIt,"%sUtils/REXXDOOR %d %s",Cmds->BBSLoc,Cmds->AcLvl[LVL_NODE_NUMBER],str);
  96.                     break;
  97.           case 'W': sprintf(RunIt,"%sUtils/REXXEXEC %d %d",Cmds->BBSLoc,Cmds->AcLvl[LVL_NODE_NUMBER],str);
  98.                     break;
  99.           case 'L': sprintf(RunIt,"%s %d",str,Cmds->AcLvl[LVL_NODE_NUMBER]);
  100.                     break;
  101.           default:  sprintf(RunIt,"%s %d",str,Cmds->AcLvl[LVL_NODE_NUMBER]);
  102.                     break;
  103.         }
  104.         if(DOORTYPE=='R') DOORTYPE='X';
  105.         
  106.         DoorLog(DOORTYPE,TempCmd);
  107.         if(DoorPassWord[0]!='\0')
  108.         {
  109.            AEPutStr("\r\n");
  110.            AEPutStr("Enter Password >: ");
  111.            strcpy(TempCmd,"");
  112.            stat=LineInputConverted("",TempCmd,15,KEYBOARD_TIMEOUT);
  113.            if(stat<0) {   UnLockDoor(&LockDoor); return(2); }
  114.            stat=StringCompare(TempCmd,DoorPassWord);
  115.            if(strcmp(TempCmd,DoorPassWord))
  116.            {
  117.              AEPutStr("\r\nInValid Password!\r\n\r\n"); UnLockDoor(&LockDoor); return(1); 
  118.              
  119.            }
  120.            else AEPutStr("\r\n");
  121.         } 
  122.         if(!StartProcess(RunIt,DoorStack))
  123.         { AEPutStr("Error Loading Module\r\n\r\n"); UnLockDoor(&LockDoor);return(1); } 
  124.         if(DOORTYPE=='I' || DOORTYPE=='L')
  125.         { 
  126.           DoorLog(DOORTYPE,STRNULL);UnLockDoor(&LockDoor);return(1);
  127.         }
  128.         if(Control(Cmds->AcLvl[LVL_NODE_NUMBER],DOORTYPE,Private))
  129.         { 
  130.           DoorLog(DOORTYPE,STRNULL);
  131.           UnLockDoor(&LockDoor);
  132.           PurgeLine();return(2);
  133.         } 
  134.         else 
  135.         { 
  136.           DoorLog(DOORTYPE,STRNULL);
  137.           UnLockDoor(&LockDoor);
  138.           return(1); 
  139.         }
  140.    }
  141.    if(ErrorDoorInUse) 
  142.    { 
  143.      sprintf(TempCmd,"%sUserInDoor",Cmds->BBSLoc);
  144.      if(!ChecktoDisplay(TempCmd,RunIt,1,0))
  145.     {
  146.        AEPutStr("This Door is in use at this time\r\n");
  147.     }
  148.      return(1);
  149.    }
  150.    if(notvaliddoor)
  151.    {                 
  152.       if(!Private)
  153.       {
  154.         if(DoorAccessHigher)
  155.         AEPutStr("\r\nCommand requires higher access.\r\n\r\n");
  156.         else
  157.         AEPutStr("\r\nNo such command!!  Use '?' for command list.\r\n\r\n");
  158.       }
  159.       UnLockDoor(&LockDoor);
  160.       return(1);
  161.    }
  162.    return(0);
  163. }
  164.  
  165. char *LookUp(char str[],char File[],int Private,BPTR *LockDoor)
  166. {
  167.    register int i;
  168.    struct DiskObject *dobj;
  169.    char BBSCMD[400];
  170.    char ReturnStr[400];
  171.    char temp[200];
  172.   char another[200];
  173.    char *s;
  174.    char **oldtooltypes;
  175.    char LineType;
  176.    int length;
  177.    int Access=255;
  178.    Async=TRUE;
  179.    sprintf(BBSCMD,"%s%s",File,str);
  180.    i=strlen(str);
  181.    length=strlen(File)-1;
  182.    i+=length;
  183.    strcpy(ReturnStr,"");
  184.    PassParams=FALSE;
  185.    while(i>length)
  186.    {
  187.      if(dobj=GetDiskObject(BBSCMD))
  188.      {
  189.         oldtooltypes=dobj->do_ToolTypes;
  190.         strcpy(ReturnStr,BBSCMD);
  191.         if(s=FindToolType(oldtooltypes,"LOCATION"))
  192.         {
  193.            strcpy(ReturnStr,s); 
  194.         }
  195.         LineType='M';
  196.         if(s=FindToolType(oldtooltypes,"MULTINODE"))
  197.         {
  198.           if(MatchToolValue(s,"YES"))
  199.           {
  200.              LineType='M';
  201.           }
  202.           else LineType='S';
  203.         }
  204.         if(s=FindToolType(oldtooltypes,"ACCESS"))
  205.         {
  206.            strcpy(temp,s); Access=atoi(temp);
  207.         }
  208.         DOORTYPE='I';
  209.         if(s=FindToolType(oldtooltypes,"TYPE"))
  210.         {
  211.            if(MatchToolValue(s,"XIM")) DOORTYPE='X';
  212.            if(MatchToolValue(s,"AIM")) DOORTYPE='R';
  213.            if(MatchToolValue(s,"IIM")) DOORTYPE='I';
  214.            if(MatchToolValue(s,"TIM")) DOORTYPE='P';
  215.            if(MatchToolValue(s,"AEM")) DOORTYPE='W';
  216.            if(MatchToolValue(s,"SIM")) { Async=FALSE;DOORTYPE='L'; } 
  217.              
  218.         }
  219.         strcpy(DoorPassWord,"");
  220.         if(s=FindToolType(oldtooltypes,"PASSWORD"))
  221.         {
  222.            strcpy(DoorPassWord,s); 
  223.         }
  224.         if(s=FindToolType(oldtooltypes,"PASS_PARAMETERS")) 
  225.            PassParams=atoi(s);
  226.          if(s=FindToolType(oldtooltypes,"INTERNAL"))
  227.               {
  228.                 strcpy(ReturnStr,s);  DOORTYPE='G';strupr(ReturnStr);
  229.                 FreeDiskObject(dobj); notvaliddoor=0; ErrorDoorInUse=0;
  230.                  return(ReturnStr);
  231.               }
  232.         DoorStack=4096L;
  233.         if(s=FindToolType(oldtooltypes,"STACK"))
  234.         {
  235.            strcpy(temp,s); DoorStack=atol(temp);
  236.         }
  237.         
  238.         if(LineType=='S')
  239.         {
  240.           sprintf(another,"%s.lock",ReturnStr);
  241.         if(!(*(LockDoor)=Lock(another,ACCESS_WRITE))) ErrorDoorInUse=1;
  242.         }
  243.         if(User.Sec_Status<Access) DoorAccessHigher=TRUE;
  244.         if((User.Sec_Status>=Access || Private) && Access!=0 && ErrorDoorInUse==0)
  245.         {
  246.           FreeDiskObject(dobj);
  247.           return(ReturnStr);
  248.         }else notvaliddoor=1;
  249.       if(!ErrorDoorInUse && LineType=='S') UnLockDoor(LockDoor);
  250.         FreeDiskObject(dobj); break;
  251.     }
  252.     BBSCMD[i]='\0';
  253.     i--; if(Private) break;
  254.   }
  255.   if(notvaliddoor) strcpy(MAINMENU_Li,"");
  256.   return("");
  257. }
  258. int UpperCheck(char str1[],char str2[])
  259. {
  260.    strupr(str1);
  261.    strupr(str2);
  262.    if(*(str2)=='*')
  263.    {
  264.       if(!strcmp(str1,str2+1)) return(1);
  265.       if(!strnicmp(str1,str2+1,strlen(str2+1))) 
  266.       { strcpy(MAINMENU_Li,""); return(0); }
  267.    }
  268.    
  269.    if(!strcmp(str1,str2))
  270.        return(1);
  271.    return(0);
  272. }
  273.  
  274. void UnLockDoor(BPTR *DoorLock)
  275. {
  276.   if(*(DoorLock)!=NULL) UnLock(*(DoorLock));
  277.   *(DoorLock)=NULL;
  278. }
  279. int CheckInUse(char *str)
  280. {
  281.    FILE *fi;
  282.    
  283.    char TestIt[200];
  284.    sprintf(TestIt,"T:%s",str);
  285.    StripReturn(TestIt);
  286.    strupr(TestIt);
  287.    fi=fopen(TestIt,"r");
  288.    if(fi==NULL)
  289.    {
  290.      fi=fopen(TestIt,"w");
  291.      fclose(fi);
  292.      ErrorDoorInUse=0; return(0);
  293.    }
  294.    fclose(fi);
  295.    return(1);
  296. }
  297.  
  298. void RemoveEnvDoor(char *str)
  299. {
  300.    char TestIt[200];
  301.    sprintf(TestIt,"T:%s",str);
  302.    StripReturn(TestIt);
  303.    DeleteFile(TestIt);
  304. }
  305. void DoorLog(char Type,char *str)
  306. {
  307.  
  308.   FILE *fi;
  309.   long TSys;
  310.   char string[200];
  311.   char str1[200];
  312.   if(!Sopt->Toggles[2]) return;
  313.                   TSys=time(NULL);
  314.   sprintf(str1,"%s",ctime(&TSys));
  315.   str1[strlen(str1)-1]='\0';
  316.   if(str[0]!=NULL)
  317.   sprintf(string,"[%-25.25s] %s - %c - %-10.10s\n",str1,User.Name,Type,str);
  318.   else
  319.   sprintf(string,"[%-25.25s] %s - %c - Exiting\n",str1,User.Name,Type);
  320.  
  321.   sprintf(str1,"%sNode%d/DoorLog",Cmds->BBSLoc,Cmds->AcLvl[LVL_NODE_NUMBER]);
  322.   fi=fopen(str1,"a");
  323.   fprintf(fi,"%s",string);
  324.   fclose(fi);
  325.  
  326. }
  327.  
  328. struct TagItem tags[]={ {SYS_Input,0},{SYS_Output,0},{SYS_Asynch,TRUE},{NP_StackSize,0},{NP_Priority,0},{TAG_DONE,0}};
  329.  
  330. int StartProcess(char *s,ULONG Stack)
  331. {
  332.     int temp;
  333.     tags[3].ti_Data=Stack;
  334.     if(Async) tags[2].ti_Data=TRUE; else tags[2].ti_Data=FALSE;
  335.     temp=SystemTagList(s,tags);
  336.     if(temp==-1)
  337.     {
  338.       return(0);
  339.     }
  340.     return(1);
  341. }
  342.  
  343. ULONG protocol;
  344. ULONG xprinit;
  345. ULONG ReceivePath;
  346. ULONG SendPath;
  347. UBYTE sendopt;
  348. UBYTE myxprunit;
  349. ULONG myxprdevice;
  350. UBYTE BatchXfer;
  351. extern void xprsequence(void);
  352. void XPRSend(char *filename)
  353.   ULONG time1;
  354.   ULONG time2;
  355.   sendopt=1;
  356.   
  357.   protocol=(ULONG)&Xprlib[0];
  358.   xprinit=(ULONG)&XprOpts[0];
  359.   SendPath=(ULONG)filename;
  360.   myxprdevice=(ULONG)Cmds->SerDev;
  361.   myxprunit=Cmds->SerDevUnit;
  362.   time1=time(NULL);
  363.   xprsequence();
  364.   time2=time(NULL);
  365.   TTTM=time2-time1;
  366.  TTEFF=(((TBT/TTTM)*100L)/(Online_Baud/10L));
  367.   //if(Online_NFiles!=0) Online_NFiles /=2;
  368.  Delay(50L);
  369.         AbortIO(ReadSerReq);
  370.         WaitIO(ReadSerReq);
  371.    ReadSerReq->IOSer.io_Command = CMD_READ;
  372.         ReadSerReq->IOSer.io_Data    = (APTR)&serin[0];
  373.         ReadSerReq->IOSer.io_Length  = 1L;
  374.         SendIO(ReadSerReq);
  375.  
  376. }
  377. void XPRReceive(char *filename)
  378.   char temp[200];
  379.   ULONG time1;
  380.   ULONG time2;
  381.   sprintf(temp," %s",filename);
  382.   protocol=(ULONG)&Xprlib[0];
  383.   xprinit=(ULONG)&XprOpts[0];
  384.   ReceivePath=(ULONG)&temp[0];
  385.   myxprdevice=(ULONG)Cmds->SerDev;
  386.   myxprunit=Cmds->SerDevUnit;
  387.   sendopt=0;
  388.   time1=time(NULL);
  389.   xprsequence();
  390.   time2=time(NULL);
  391.   TTTM=time2-time1;
  392.       
  393.  Delay(50L);
  394.         AbortIO(ReadSerReq);
  395.         WaitIO(ReadSerReq);
  396.    ReadSerReq->IOSer.io_Command = CMD_READ;
  397.         ReadSerReq->IOSer.io_Data    = (APTR)&serin[0];
  398.         ReadSerReq->IOSer.io_Length  = 1L;
  399.         SendIO(ReadSerReq);
  400.  
  401.   ReceivePlayPen();
  402.  
  403.   TTEFF=(((TBT/TTTM)*100L)/(Online_Baud/10L));
  404.       
  405. }
  406.  
  407. void GetProtocol(void)
  408. {
  409.   char string[100];
  410.   register int i;
  411.   strcpy(Xprlib,"INTERNAL"); strcpy(prototitle,"Internal Zmodem");
  412.   if(GET_BIT(ACS_XPR_SEND) || GET_BIT(ACS_XPR_RECEIVE))
  413.   {
  414.     sprintf(GSTR1,"%sProtocols/XprTypes",Cmds->BBSLoc);
  415.     sprintf(GSTR2,"TITLE.%d",User.XferProtocol+1);
  416.     GetFromIconStr(GSTR1,GSTR2,prototitle);
  417.     sprintf(GSTR2,"LIBRARY.%d",User.XferProtocol+1);
  418.     GetFromIconStr(GSTR1,GSTR2,Xprlib);
  419.     strcpy(XprOpts,"TN,AY,OR,KY,SN,RN,DN,F0,B32");
  420.   if(strcmp(Xprlib,"INTERNAL"))
  421.   {
  422.     strcpy(string,Xprlib);
  423.     i=strlen(string)-1;
  424.     while(string[i]!='\0' && string[i]!='.') { string[i]='\0'; i--; }
  425.     if(i>0) string[i]='\0';
  426.     sprintf(GSTR1,"%sProtocols/%s",Cmds->BBSLoc,string);
  427.     GetFromIconStr(GSTR1,"OPTIONS",XprOpts);
  428.     if(IsFromIcon(GSTR1,"AE_BATCH")) BatchXfer=TRUE; else BatchXfer=FALSE;
  429.   }
  430.   }
  431. }
  432.  
  433. void ClearProtocol(void)
  434. {
  435.    User.XferProtocol=0;
  436.      strcpy(Xprlib,"INTERNAL"); strcpy(prototitle,"Internal Zmodem");
  437. }